import numpy as np
import matplotlib.pyplot as plt
from PSO import *
from delivery_swarm import *
%matplotlib inline
particle = DeliveryService(nr_couriers = 10, nr_orders = 500, nr_restaurants = 10)
filename = './cases/przypadek10k500z10r.txt'
particle.save_to_file(filename)
del particle
del filename
Wykonaj eksperymenty dla różnych parametrów {inertia,cp,cg}
from summary import *
import pandas as pd
from IPython.display import Image
inertia cp i cg ustalono na wartość 0.1from summary import *
import warnings
warnings.simplefilter("ignore")
from tqdm import tqdm
for nr_particles in tqdm([5, 10, 15, 20, 25, 30, 35, 40, 50]):
run_pso_and_save_summary('przypadek10k500z10r.txt',nr_particles,0.1,0.1,0.1,40,draw_route=False)
import regex as re
experiments_logs = pd.read_csv('summary.csv')
experiment_data = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt']
experiment_data['loss'] = experiment_data['loss'].astype('float32')
experiment_data['nr_particles'] = experiment_data['nr_particles'].astype('float32')
experiment_data.plot.bar('nr_particles','loss', title="Funkcja kosztu dla różnej liczby osobników")
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data['loss'].min()} \nDla liczby osobników: {experiment_data[experiment_data['loss']==experiment_data['loss'].min()]['nr_particles'].values[0]}")
time_performance = {k:experiment_data[k] for k in experiment_data.columns[1:6]}
time_performance['nr_particles'] = experiment_data['nr_particles']
fif,ax =plt.subplots(figsize=(10,5))
time_performance=pd.DataFrame(time_performance)
time_performance.plot.bar(x = 'nr_particles',y = ['PSO_time','avg_epoch_time'], logy = True, ax = ax)
pd.DataFrame(time_performance).plot.bar(x = 'nr_particles',y = ['avg_v_computation','avg_move_time','avg_fitness_calculation_time'], logy = True,figsize=(10,5))
for nr_epoch in tqdm([20, 30, 40,50,60]):
run_pso_and_save_summary('przypadek10k500z10r.txt',20,0.1,0.1,0.1,nr_epoch,draw_route=False)
for nr_epoch in tqdm([20, 30, 40,50,60]):
run_pso_and_save_summary('przypadek10k500z10r.txt',35,0.1,0.1,0.1,nr_epoch,draw_route=False)
experiments_logs = pd.read_csv('summary.csv')
experiment_data2035 = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt'][-10:]
experiment_data2035.plot.bar('nr_epochs','loss', title="Funkcja kosztu dla danej ilości iteracji")
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data2035['loss'].min()} \nDla liczby osobników: {experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]['nr_particles'].values[0]}\nIteracji: {experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]['nr_epochs'].values[0]}")
for nr_particles in tqdm([20, 35]):
for nr_epoch in tqdm([65,75,80]):
run_pso_and_save_summary('przypadek10k500z10r.txt',nr_particles,0.1,0.1,0.1,nr_epoch,draw_route=False)
experiments_logs = pd.read_csv('summary.csv')
experiment_data2035 = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt'][-6:]
experiment_data2035.plot.bar('nr_epochs','loss', title="Funkcja kosztu dla danej ilości iteracji")
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data2035['loss'].min()} \nDla liczby osobników: {experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]['nr_particles'].values[0]}\nIteracji: {experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]['nr_epochs'].values[0]}")
Badano prebieg działania algorytmu w zalezności od wartości parametrów inertia cp cg dla 20 osobników oraz liczbie iteracji równej 50 (najlepszej wyselekcjonowanej z poprzedniego eksperymentu)
for param in tqdm(range(10)):
inertia = np.random.choice([0.01,0.2,0.5,0.8])
cp = np.random.choice([0.01,0.2,0.5,0.8])
cg = np.random.choice([0.01,0.2,0.5,0.8])
run_pso_and_save_summary('przypadek10k500z10r.txt',20,inertia,cp,cg,50,draw_route=False)
import matplotlib.image as mpimg
experiments_logs = pd.read_csv('summary.csv')
experiment_data2035 = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt'][-10:]
experiment_data2035.plot.bar('nr_epochs','loss', title="Funkcja kosztu dla danej ilości iteracji")
best = experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data2035['loss'].min()} \nDla liczby iteracji: {best['nr_epochs'].values[0]}\ncp: {best['cp'].values[0]}\ncg: {best['cg'].values[0]}\ninertia:{best['inertia'].values[0]}")
Dobór parametrów w losowy sposób nie porawił wartości funkcji celu. Przy dostosowywaniu parametrów należy kierować sie wiedzą na temat ich wpływu na działanie algorytmu, oraz dozosować ich wartość do specyfiki problemu.
W poniższych rozważniach wybrano małą liczbę osobników aby możliwe było monitorowanie przebieku kazdego z nich i prezentacja na wykresie, ale również ich wzajemny wpływ na siebie.
inertia¶Aby zbadać wpływ parametru inertia, przeprowadzimy eksperyment da 5 jednostek, 40 iteracji oraz wybranych wartości parametru inertia. Parametry cp i cg ustawiam na 0.1 wyzerowanie parametrów spowodowałoby całkowity brak ruchu jednostek.
for inertia in [0.01,0.2,0.5,0.8]:
run_pso_and_save_summary('przypadek10k500z10r.txt',5,inertia,0.1,0.1,40,draw_route=False)
import matplotlib.image as mpimg
experiments_logs = pd.read_csv('summary.csv')
experiment_data2035 = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt'][-4:]
experiment_data2035.plot.bar('nr_epochs','loss', title="Funkcja kosztu dla danej ilości iteracji")
best = experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data2035['loss'].min()} \ninertia:{best['inertia'].values[0]}")
fig = plt.figure(figsize=(100,100),dpi=80)
inertia = [0.01,0.2,0.5,0.8]
for case,row in zip(experiment_data2035['particles_history_plot'],range(4)):
plt.subplot(4, 3, 3*row+1)
plt.imshow(mpimg.imread(case,'png'))
plt.title( label = f'Inertia {inertia[row]}', fontdict={'fontsize': 70,'fontweight' : None, 'verticalalignment': 'baseline', 'horizontalalignment': 'right'} )
plt.subplot(4, 3, 3*row+2)
plt.imshow(mpimg.imread('mobility_plots/'+case.split('/')[1],'png'))
plt.subplot(4, 3, 3*row+3)
plt.imshow(mpimg.imread('draw_avg_swarm_loss_plots/'+case.split('/')[1],'png'))
cp¶Aby zbadać wpływ parametru cp, przeprowadzimy eksperyment da 5 jednostek, 40 iteracji oraz wybranych wartości parametru cp. Parametry inertia i cg ustawionono wzorcowe 0.1.
for cp in [0.01,0.2,0.5,0.8]:
run_pso_and_save_summary('przypadek10k500z10r.txt',5,0.1,cp,0.1,40,draw_route=False)
import matplotlib.image as mpimg
experiments_logs = pd.read_csv('summary.csv')
experiment_data2035 = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt'][-4:]
experiment_data2035.plot.bar('nr_epochs','loss', title="Funkcja kosztu dla danej ilości iteracji")
best = experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data2035['loss'].min()} \ncp:{best['cp'].values[0]}")
fig = plt.figure(figsize=(100,100),dpi=80)
cp = [0.01,0.2,0.5,0.8]
for case,row in zip(experiment_data2035['particles_history_plot'],range(4)):
plt.subplot(4, 3, 3*row+1)
plt.imshow(mpimg.imread(case,'png'))
plt.title( label = f'cp {cp[row]}', fontdict={'fontsize': 70,'fontweight' : None, 'verticalalignment': 'baseline', 'horizontalalignment': 'right'} )
plt.subplot(4, 3, 3*row+2)
plt.imshow(mpimg.imread('mobility_plots/'+case.split('/')[1],'png'))
plt.subplot(4, 3, 3*row+3)
plt.imshow(mpimg.imread('draw_avg_swarm_loss_plots/'+case.split('/')[1],'png'))
Wartość cp odpowiadają za utrzymywanie się blisko własnego minimum.
cp tym mniejsze wachania dla poszczególnych osobników oraz mniejsza szybkosć zbieżnościcg¶Aby zbadać wpływ parametru inertia, przeprowadzimy eksperyment da 5 jednostek, 40 iteracji oraz wybranych wartości parametru cg. Parametry inertia i cp ustawionono wzorcowe 0.1.
for cg in [0.01,0.2,0.5,0.8]:
run_pso_and_save_summary('przypadek10k500z10r.txt',5,0.1,0.1,cg,40,draw_route=False)
import matplotlib.image as mpimg
experiments_logs = pd.read_csv('summary.csv')
experiment_data2035 = experiments_logs[experiments_logs['case_name']=='przypadek10k500z10r.txt'][-4:]
experiment_data2035.plot.bar('cg','loss', title="Funkcja kosztu dla danej ilości iteracji")
best = experiment_data2035[experiment_data2035['loss']==experiment_data2035['loss'].min()]
print(f"Najmniejsza wartość funkcji kosztu: {experiment_data2035['loss'].min()} \ncg:{best['cg'].values[0]}")
fig = plt.figure(figsize=(100,100),dpi=80)
cg = [0.01,0.2,0.5,0.8]
for case,row in zip(experiment_data2035['particles_history_plot'],range(4)):
plt.subplot(4, 3, 3*row+1)
plt.imshow(mpimg.imread(case,'png'))
plt.title( label = f'cg {cg[row]}', fontdict={'fontsize': 70,'fontweight' : None, 'verticalalignment': 'baseline', 'horizontalalignment': 'right'} )
plt.subplot(4, 3, 3*row+2)
plt.imshow(mpimg.imread('mobility_plots/'+case.split('/')[1],'png'))
plt.subplot(4, 3, 3*row+3)
plt.imshow(mpimg.imread('draw_avg_swarm_loss_plots/'+case.split('/')[1],'png'))
cg przyspiesza zbierzność algorytmucg powoduje utknięcie w lokalnym minimum reprezentowanym przez pierwotnie najlepszy elementEksperymenty potwierdzają, że dane wartości parametrów realizują założenia związane z nimi.
inertia określa na jakie odstępstwa od obecnej prędkości (zmianę kierunku) można pozwolić osobnikowi, zwiększenie parametru zmniejsza wpływ najlepszych wartości dla roju i osobnika, zwiększa znaczenie obecnej prędkości osobnika.cp określa zaufanie do własnej, historycznie najlepszej pozycji. Zmniejszenie wartości cp zwększa ruchliwość jednoski pozwala na wieksze zmiany w prędkości, "śmielszy" ruch osobnika.cg określa wpływ najlepszej jednoski na ruch pozostałych, przyspiesza zbieżność. Zbyt wysoka wartość powoduje utknięcie w lokalnym minimum.cg i inertia oraz zbyt wysoki cp, uniemożliwiają zmiany rozwiąznia, niewielki ruch osobników nie pozwala na przegląd duzej liczby rozwiązań, a w konsekwencji znalezienie najlepszego rozwiązania.inertia zawęża tor ruchu, cp zmniejsza możliwośc ruchu w kierunku innych rozwiązań, cg przyspiesza ruch w kierunku lokalnego minimum, które może okazać się nieoptymalnym rozwiązaniem.